import { generateToken, verifyToken } from '@/api/shareController'
import { getGenerateTeachVo } from '@/api/generateTeachController'
import { getGenerateExamVo } from '@/api/generateExamController'
import { message } from 'ant-design-vue'

// 业务类型枚举（保持不变）
export enum BizType {
  GENTEACH = "GenerateTeach", // 教学大纲
  GENEXAM = "GenerateExam",   // 生成考核
}

/**
 * 生成分享链接
 * @param isEncrypted 是否加密
 * @param genRequest 包含bizType和bizId的请求参数
 * @returns 完整的分享链接
 */
export const generateShare = async (
  isEncrypted: boolean,
  genRequest: API.ShareGenerateRequest
): Promise<string> => {
  // 校验必要参数
  if (!genRequest.bizType || !genRequest.bizId) {
    throw new Error("业务类型和ID不能为空")
  }

  if (isEncrypted) {
    // 加密模式：调用后端生成token
    const res = await generateToken(genRequest)
    if (!res.data?.data) {
      throw new Error("生成加密链接失败")
    }
    return `${window.location.origin}/user/view_md?token=${res.data.data}`
  } else {
    // 非加密模式：明文拼接参数
    return `${window.location.origin}/user/view_md?bizType=${genRequest.bizType}&bizId=${genRequest.bizId}`
  }
}

/**
 * 验证分享链接并加载数据
 * @param route 路由对象（包含query参数）
 * @returns 加载的数据
 */
export const verifyAndLoadData = async (route: any) => {
  try {
    const { token, bizType: type, bizId: id } = route.query

    // 加密模式：通过token获取数据
    if (token) {
      const res = await verifyToken({ token })
      const { bizType, bizId } = res.data?.data || {}
      if (!bizType || !bizId) {
        message.error("无效的加密数据")
        return null
      }
      return await loadData(bizType, bizId)
    }

    // 非加密模式：直接使用明文参数
    if (type && id) {
      const validTypes = [BizType.GENEXAM, BizType.GENTEACH]
      if (!validTypes.includes(type as BizType)) {
        message.error("无效的业务类型")
        return null
      }
      return await loadData(type, id)
    }

    // 参数不完整
    message.error("分享链接格式错误")
    return null

  } catch (error) {
    console.error("分享验证失败:", error)
    message.error("加载失败，请检查链接是否有效")
    return null
  }
}

/**
 * 根据业务类型加载对应数据
 * @param type 业务类型
 * @param id 数据ID
 * @returns 业务数据
 */
async function loadData(type: string, id: any) {
  switch (type) {
    case BizType.GENTEACH:
      return await getGenerateTeachVo({ id })
    case BizType.GENEXAM:
      return await getGenerateExamVo({ id })
    default:
      throw new Error(`未知业务类型: ${type}`)
  }
}

// 导出完整模块
export default {
  generateShare,
  verifyAndLoadData,
  BizType
}
